package com.booking;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 计算java文件行数
 * @author Qikai.Lin
 * @date 2023/5/12
 */
public class Count {
    static long normalLines = 0; // 代码行
    static long commentLines = 0; // 注释行
    static long whiteLines = 0; // 空行

    public static void main(String[] args) {
        Count sjc = new Count();
        File f = new File("E:\\Code\\projects\\HomeStay\\homestay-booking-vue"); // 目录
        //System.out.println(f.getName());//输出文件最后一级目录名
        sjc.treeFile(f);
        System.out.println("代码行：" + normalLines);
        System.out.println("注释行：" + commentLines);
        System.out.println("空行：" + whiteLines);
    }

    //查找出一个目录下所有的.java文件,f 要查找的目录
    private void treeFile(File f) {
        File[] childs = f.listFiles();
        if (childs == null) return;
        for (File child : childs) {
            if (!child.isDirectory()) {
                if (child.getName().matches(".*\\.java$")) {
                    System.out.println(child.getName());//输出.java文件名
                    sumCode(child);
                }
            } else {
                treeFile(child);
            }
        }
    }

    //计算一个.java文件中的代码行，空行，注释行,file 要计算的.java文件
    private void sumCode(File file) {
        BufferedReader br = null;
        boolean comment = false;
        try {
            br = new BufferedReader(new FileReader(file));
            String line;
            try {
                while ((line = br.readLine()) != null) {
                    line = line.trim();
                    if (line.matches("^\\s&&[^\\n]*$")) {
                        whiteLines++;// 空行
                    } else if (line.startsWith("/*") && !line.endsWith("*/")) {//以"/*"开头，(/*注释换行*/)
                        commentLines++;// 注释行(/**)
                        comment = true;
                    } else if (comment) {
                        commentLines++;// 注释行(*,*/)
                        if (line.endsWith("*/")) {//以"*/"结尾
                            comment = false;
                        }
                    } else if (line.startsWith("//")) {//以"//"开头
                        commentLines++;// 注释行
                    } else if (line.startsWith("/*")) {//以"/*"开头，(/*注释不换行*/)
                        commentLines++;// 注释行
                    }
                    else {
                        normalLines++;// 代码行
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                    br = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

